home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / EyeBall.st < prev    next >
Text File  |  1993-07-24  |  4KB  |  162 lines

  1. "    NAME        EyeBall=manchester
  2.     AUTHOR        TPH@cs.man.ac.uk
  3.     FUNCTION watches you at work 
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    10 Nov 1987
  10. SUMMARY    EyeBall
  11.     really does give you the feeling that you are being watched!
  12.    There are some examples for you to play with.(2.2). TPH
  13. "!
  14. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 10 November 1987 at 1:56:17 pm'!
  15.  
  16.  
  17.  
  18. !Point methodsFor: 'arithmetic'!
  19.  
  20. negated
  21.     ^x negated @ y negated! !
  22.  
  23. 'From Smalltalk-80, Version 2.2 of July 4, 1987 on 10 November 1987 at 1:46:47 pm'!
  24.  
  25. Object subclass: #EyeBall
  26.     instanceVariableNames: 'eyePosition pupilPosition eyeDiameter pupilDiameter eyeForm pupilForm '
  27.     classVariableNames: ''
  28.     poolDictionaries: ''
  29.     category: 'Graphics-Games'!
  30.  
  31.  
  32. !EyeBall methodsFor: 'accessing'!
  33.  
  34. eyeDiameter
  35.     "Answer with the overall diameter of the receiver."
  36.  
  37.     ^eyeDiameter!
  38.  
  39. eyeForm
  40.     "Answer with the form representing the main part of the receiver."
  41.  
  42.     ^eyeForm!
  43.  
  44. eyePosition
  45.     "Answer with a point representing the position of the receiver."
  46.  
  47.     ^eyePosition!
  48.  
  49. pupilDiameter
  50.     "Answer with the diameter of the receiver's pupil."
  51.  
  52.     ^pupilDiameter!
  53.  
  54. pupilForm
  55.     "Answer with the form representing the pupil of the receiver."
  56.  
  57.     ^pupilForm!
  58.  
  59. pupilPosition
  60.     "Answer with a point representing the position of the receiver's pupil."
  61.  
  62.     ^pupilPosition! !
  63.  
  64. !EyeBall methodsFor: 'modifying'!
  65.  
  66. updatePupil
  67.     "Update the receiver's pupil, if necessary.  Answer true if
  68.      a change was made, otherwise false."
  69.  
  70.     | newP diff sign |
  71.     diff _ (Sensor cursorPoint - eyePosition // 5).
  72.     sign _ (diff x sign)@(diff y sign).
  73.     newP _ eyePosition + ((diff abs min: (eyeDiameter // 3) asPoint) * sign).
  74.     newP = pupilPosition
  75.         ifTrue: [^false]
  76.         ifFalse: [pupilPosition _ newP.  ^true]! !
  77.  
  78. !EyeBall methodsFor: 'displaying'!
  79.  
  80. display
  81.     "Display the receiver at its location, by creating an OpaqueFrom
  82.      appropriately and displaying it."
  83.  
  84.     | tempForm opaqueForm |
  85.     tempForm _ (Form extent: self eyeForm extent) offset: self eyeForm offset.
  86.     pupilForm
  87.         displayOn: tempForm
  88.         at: tempForm offset negated + self pupilPosition - self eyePosition
  89.         rule: Form over.
  90.     eyeForm
  91.         displayOn: tempForm
  92.         at: tempForm offset negated
  93.         rule: Form and.
  94.     opaqueForm _ OpaqueForm figure: tempForm shape: self eyeForm.
  95.     opaqueForm displayAt: self eyePosition! !
  96.  
  97. !EyeBall methodsFor: 'private'!
  98.  
  99. setPosition: eyePos eyeDia: eyeD pupilDia: pupilD
  100.     "Initialise the instance variables, calculating the forms from
  101.      the diameters given."
  102.  
  103.     eyePosition _ eyePos.
  104.     pupilPosition _ eyePos.
  105.     eyeDiameter _ eyeD.
  106.     eyeForm _ Form dotOfSize: eyeD.
  107.     pupilDiameter _ pupilD.
  108.     pupilForm _ Form dotOfSize: pupilD.! !
  109. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  110.  
  111. EyeBall class
  112.     instanceVariableNames: ''!
  113.  
  114.  
  115. !EyeBall class methodsFor: 'instance creation'!
  116.  
  117. position: eyePos eyeDia: eyeD pupilDia: pupilD
  118.     ^self new setPosition: eyePos eyeDia: eyeD pupilDia: pupilD! !
  119.  
  120. !EyeBall class methodsFor: 'examples'!
  121.  
  122. exampleWorkspace1
  123.     "Select and execute the expressions here to create and
  124.      manipulate EyeBalls."
  125.     "
  126.     | eye |
  127.     eye _ EyeBall position: 100@100 eyeDia: 60 pupilDia: 42.
  128.     Smalltalk at: #EyeProcess put: [
  129.         [true] whileTrue: [
  130.             eye updatePupil ifTrue: [eye display].
  131.             (Delay forMilliseconds: 250) wait]] newProcess.
  132.  
  133.     EyeProcess resume.
  134.  
  135.     EyeProcess terminate.
  136.  
  137.     Smalltalk removeKey: #EyeProcess.
  138.     ScheduledControllers restore.
  139.     Smalltalk garbageCollect.
  140.     "!
  141.  
  142. exampleWorkspace2
  143.     "Select and execute the expressions here to create and
  144.      manipulate EyeBalls."
  145.     "
  146.     | leftEye rightEye |
  147.     leftEye _ EyeBall position: 100@100 eyeDia: 30 pupilDia: 18.
  148.     rightEye _ EyeBall position: 150@100 eyeDia: 30 pupilDia: 18.
  149.     Smalltalk at: #EyeProcess put: [
  150.         [true] whileTrue: [
  151.             leftEye updatePupil ifTrue: [leftEye display].
  152.             rightEye updatePupil ifTrue: [rightEye display].
  153.             (Delay forMilliseconds: 250) wait]] newProcess.
  154.  
  155.     EyeProcess resume.
  156.  
  157.     EyeProcess terminate.
  158.     Smalltalk removeKey: #EyeProcess.
  159.     ScheduledControllers restore.
  160.     Smalltalk garbageCollect.
  161.     "! !
  162.